# -*- coding: utf-8 -*-
"""
小说爬虫主运行脚本
"""

import sys
import os
import argparse
from pathlib import Path

# 添加项目根目录到Python路径
sys.path.insert(0, str(Path(__file__).parent))

from examples.basic_example import BasicNovelCrawler
from examples.novel_crawler import NovelCrawler
from utils.logger import get_logger, log_crawler_info, log_crawler_error

def run_basic_example():
    """运行基础示例"""
    print("=" * 50)
    print("运行基础爬虫示例")
    print("=" * 50)
    
    try:
        with BasicNovelCrawler() as crawler:
            # 测试基本功能
            results = crawler.crawl_example_site()
            
            # 测试文件下载
            crawler.test_download_file()
            
            print(f"\n✅ 基础示例运行成功，获取了 {len(results)} 个结果")
            
    except Exception as e:
        print(f"❌ 基础示例运行失败: {str(e)}")
        log_crawler_error(f"基础示例运行失败: {str(e)}")

def run_novel_example():
    """运行小说爬虫示例"""
    print("=" * 50)
    print("运行小说爬虫示例")
    print("=" * 50)
    
    try:
        with NovelCrawler("generic") as crawler:
            # 由于没有真实的小说网站URL，这里只是演示框架的使用
            print("📚 小说爬虫框架已初始化")
            print("💡 要爬取真实网站，请修改 examples/novel_crawler.py 中的示例URL")
            print("🔧 或者使用自定义URL运行: python run.py --url <your_novel_url>")
            
            # 显示配置信息
            print(f"\n当前配置:")
            print(f"- 网站类型: {crawler.site}")
            print(f"- 请求延迟: {crawler.request_delay}秒")
            print(f"- 重试次数: {crawler.retry_times}")
            print(f"- 超时时间: {crawler.timeout}秒")
            
    except Exception as e:
        print(f"❌ 小说爬虫示例运行失败: {str(e)}")
        log_crawler_error(f"小说爬虫示例运行失败: {str(e)}")

def run_custom_url(url: str, site: str = "generic", max_chapters: int = 5):
    """运行自定义URL爬取"""
    print("=" * 50)
    print(f"爬取自定义URL: {url}")
    print("=" * 50)
    
    try:
        with NovelCrawler(site) as crawler:
            # 爬取小说详情
            print("🔍 正在爬取小说详情...")
            novel_detail = crawler.crawl_novel_detail(url)
            
            if novel_detail:
                print(f"✅ 小说详情获取成功:")
                print(f"   标题: {novel_detail.get('title', 'N/A')}")
                print(f"   作者: {novel_detail.get('author', 'N/A')}")
                print(f"   简介: {novel_detail.get('summary', 'N/A')[:100]}...")
                
                # 尝试爬取章节
                print(f"\n📖 正在爬取章节列表...")
                chapters = crawler.crawl_chapter_list(url)
                
                if chapters:
                    print(f"✅ 找到 {len(chapters)} 个章节")
                    
                    # 爬取前几章内容
                    print(f"\n📝 正在爬取前 {max_chapters} 章内容...")
                    chapter_contents = []
                    
                    for i, chapter in enumerate(chapters[:max_chapters], 1):
                        print(f"   爬取第 {i} 章: {chapter.get('title', 'Unknown')[:30]}...")
                        content = crawler.crawl_chapter_content(chapter.get('url', ''))
                        if content:
                            chapter_contents.append(content)
                    
                    # 保存数据
                    complete_data = {
                        **novel_detail,
                        "chapters": chapter_contents,
                        "total_chapters": len(chapter_contents)
                    }
                    
                    success = crawler.save_novel_data(complete_data)
                    if success:
                        print(f"✅ 数据保存成功，共爬取 {len(chapter_contents)} 章")
                    else:
                        print("❌ 数据保存失败")
                        
                else:
                    print("⚠️  未找到章节列表")
                    
            else:
                print("❌ 小说详情获取失败")
                
    except Exception as e:
        print(f"❌ 自定义URL爬取失败: {str(e)}")
        log_crawler_error(f"自定义URL爬取失败: {str(e)}")

def show_help():
    """显示帮助信息"""
    help_text = """
🕷️  小说爬虫框架使用指南

📋 可用命令:
  python run.py --basic          # 运行基础示例（推荐新手）
  python run.py --novel          # 运行小说爬虫示例
  python run.py --url <URL>      # 爬取指定URL的小说
  python run.py --help           # 显示此帮助信息

🔧 高级选项:
  --site <site>                  # 指定网站类型 (generic, qidian, zongheng, 17k)
  --chapters <num>               # 最大爬取章节数 (默认: 5)

📝 使用示例:
  # 运行基础测试
  python run.py --basic
  
  # 运行小说框架示例
  python run.py --novel
  
  # 爬取指定小说
  python run.py --url "https://example.com/novel/123" --site generic --chapters 10

⚠️  注意事项:
  1. 首次运行请先执行: pip install -r requirements.txt
  2. 请遵守网站的robots.txt和使用条款
  3. 建议设置合理的请求延迟，避免对服务器造成压力
  4. 爬取的数据仅供个人学习研究使用

📁 输出文件位置:
  - 小说数据: data/novels/
  - 章节数据: data/chapters/
  - 日志文件: logs/

🔗 更多信息请查看项目文档和示例代码
    """
    print(help_text)

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description="小说爬虫框架")
    parser.add_argument("--basic", action="store_true", help="运行基础示例")
    parser.add_argument("--novel", action="store_true", help="运行小说爬虫示例")
    parser.add_argument("--url", type=str, help="要爬取的小说URL")
    parser.add_argument("--site", type=str, default="generic", 
                       choices=["generic", "qidian", "zongheng", "17k"],
                       help="网站类型")
    parser.add_argument("--chapters", type=int, default=5, help="最大爬取章节数")
    parser.add_argument("--help-guide", action="store_true", help="显示详细使用指南")
    
    args = parser.parse_args()
    
    # 显示欢迎信息
    print("🕷️  小说爬虫框架 v1.0")
    print("=" * 50)
    
    # 检查参数
    if args.help_guide:
        show_help()
    elif args.basic:
        run_basic_example()
    elif args.novel:
        run_novel_example()
    elif args.url:
        run_custom_url(args.url, args.site, args.chapters)
    else:
        print("❓ 请指定运行模式，使用 --help 查看可用选项")
        print("\n快速开始:")
        print("  python run.py --basic      # 运行基础示例")
        print("  python run.py --help-guide # 查看详细指南")

if __name__ == "__main__":
    main() 